home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / dev / lang / python020.lha / python / lib / grep.py < prev    next >
Text File  |  1995-10-22  |  1KB  |  63 lines

  1. # 'grep'
  2.  
  3. import regex
  4. from regex_syntax import *
  5. import string
  6.  
  7. opt_show_where = 0
  8. opt_show_filename = 0
  9. opt_show_lineno = 1
  10.  
  11. def grep(pat, *files):
  12.     return ggrep(RE_SYNTAX_GREP, pat, files)
  13.  
  14. def egrep(pat, *files):
  15.     return ggrep(RE_SYNTAX_EGREP, pat, files)
  16.  
  17. def emgrep(pat, *files):
  18.     return ggrep(RE_SYNTAX_EMACS, pat, files)
  19.  
  20. def ggrep(syntax, pat, files):
  21.     if len(files) == 1 and type(files[0]) == type([]):
  22.         files = files[0]
  23.     global opt_show_filename
  24.     opt_show_filename = (len(files) != 1)
  25.     syntax = regex.set_syntax(syntax)
  26.     try:
  27.         prog = regex.compile(pat)
  28.     finally:
  29.         syntax = regex.set_syntax(syntax)
  30.     for filename in files:
  31.         fp = open(filename, 'r')
  32.         lineno = 0
  33.         while 1:
  34.             line = fp.readline()
  35.             if not line: break
  36.             lineno = lineno + 1
  37.             if prog.search(line) >= 0:
  38.                 showline(filename, lineno, line, prog)
  39.         fp.close()
  40.  
  41. def showline(filename, lineno, line, prog):
  42.     if line[-1:] == '\n': line = line[:-1]
  43.     if opt_show_lineno:
  44.         prefix = string.rjust(`lineno`, 3) + ': '
  45.     else:
  46.         prefix = ''
  47.     if opt_show_filename:
  48.         prefix = filename + ': ' + prefix
  49.     print prefix + line
  50.     if opt_show_where:
  51.         start, end = prog.regs()[0]
  52.         line = line[:start]
  53.         if '\t' not in line:
  54.             prefix = ' ' * (len(prefix) + start)
  55.         else:
  56.             prefix = ' ' * len(prefix)
  57.             for c in line:
  58.                 if c <> '\t': c = ' '
  59.                 prefix = prefix + c
  60.         if start == end: prefix = prefix + '\\'
  61.         else: prefix = prefix + '^'*(end-start)
  62.         print prefix
  63.